home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / misc / AmigaSDLsrc.lha / amisrc / SDL_audiomem.c < prev    next >
C/C++ Source or Header  |  2001-04-29  |  2KB  |  74 lines

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
  4.  
  5.     This library is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU Library General Public
  7.     License as published by the Free Software Foundation; either
  8.     version 2 of the License, or (at your option) any later version.
  9.  
  10.     This library is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.     Library General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU Library General Public
  16.     License along with this library; if not, write to the Free
  17.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  
  19.     Sam Lantinga
  20.     slouken@devolution.com
  21. */
  22.  
  23. #ifdef SAVE_RCSID
  24. static char rcsid =
  25.  "@(#) $Id: SDL_audiomem.c,v 1.2.2.3 2001/02/10 07:20:03 hercules Exp $";
  26. #endif
  27.  
  28. /* Functions to allocate audio buffer memory, shareable across threads
  29.     (necessary because SDL audio emulates threads with fork()
  30.  */
  31.  
  32. #ifdef FORK_HACK
  33. #include <sys/types.h>
  34. #include <sys/ipc.h>
  35. #include <sys/shm.h>
  36. #include <stddef.h>
  37. #else
  38. #include <stdlib.h>
  39. #endif
  40.  
  41. #include "SDL_audiomem.h"
  42.  
  43. /* Allocate memory that will be shared between threads (freed on exit) */
  44. void *SDL_AllocAudioMem(int size)
  45. {
  46.     void *chunk;
  47.  
  48. #ifdef FORK_HACK
  49.     int   semid;
  50.     
  51.     /* Create and get the address of a shared memory segment */
  52.     semid = shmget(IPC_PRIVATE, size, (IPC_CREAT|0600));
  53.     if ( semid < 0 ) {
  54.         return(NULL);
  55.     }
  56.     chunk = shmat(semid, NULL, 0);
  57.     
  58.     /* Set the segment for deletion when it is detatched */
  59.     shmctl(semid, IPC_RMID, NULL);    /* Delets semid if shmat() fails */
  60. #else
  61.     chunk = malloc(size);
  62. #endif
  63.     return((void *)chunk);
  64. }
  65.  
  66. void SDL_FreeAudioMem(void *chunk)
  67. {
  68. #ifdef FORK_HACK
  69.     shmdt(chunk);
  70. #else
  71.     free(chunk);
  72. #endif
  73. }
  74.